package pl.poznan.put.cs.idss.viamdp.core.structures;

import java.util.List;

/**
 * Interfejs wymuszający każdym typie pól wymuszenie zsimplementowania podstawowych akcji.
 * 
 * @author Kornel Lewandowski
 * 
 */
public interface IAbstractField {

	/**
	 * Zwraca indeks bieżącego pola na osi X (punkt 0,0) w lewym górnym
	 * narożniku mapy.
	 * 
	 * @return wartość liczbowa - pozycja X
	 */
	long getFieldPositionX();

	/**
	 * Zwraca indeks bieżącego pola na osi Y (punkt 0,0) w lewym górnym
	 * narożniku mapy.
	 * 
	 * @return wartość liczbowa - pozycja Y
	 */
	long getFieldPositionY();

	/**
	 * Zwraca wartość nagrody dla górnego sąsiada w zadanej iteracji.
	 * 
	 * @param iteration
	 *            - numer iteracji, z której pobierana jest wartość
	 * 
	 * @return wartość nagrody w danym polu, w danej iteracji
	 * 
	 */
	double getTopNeighbourReward(long iteration);

	/**
	 * Zwraca wartość nagrody dla dolnego sąsiada w zadanej iteracji.
	 * 
	 * @param iteration
	 *            - numer iteracji, z której pobierana jest wartość
	 * 
	 * @return wartość nagrody w danym polu, w danej iteracji
	 * 
	 */
	double getBottomNeighbourReward(long iteration);

	/**
	 * Zwraca wartość nagrody dla lewego sąsiada w zadanej iteracji.
	 * 
	 * @param iteration
	 *            - numer iteracji, z której pobierana jest wartość
	 * 
	 * @return wartość nagrody w danym polu, w danej iteracji
	 * 
	 */
	double getLeftNeighbourReward(long iteration);

	/**
	 * Zwraca wartość nagrody dla prawego sąsiada w zadanej iteracji.
	 * 
	 * @param iteration
	 *            - numer iteracji, z której pobierana jest wartość
	 * 
	 * @return wartość nagrody w danym polu, w danej iteracji
	 * 
	 */
	double getRightNeighbourReward(long iteration);

	/**
	 * Ustawia mapę świata do której przypisane jest pole.
	 * 
	 * @param map
	 *            - obiekt klasy Map wiążący pola
	 */
	void setMap(Map map);

	/**
	 * Zwraca mapę świata z którą powiązany jest obiekt.
	 * 
	 * @return obiekt klasy Map
	 */
	Map getMap();

	/**
	 * Zwraca historię nagród dla danego pola.
	 * 
	 * @return - lista nagród
	 */
	List<Double> getRewardsHistory();

}
